æéãªãŒãããã³ïŒFSAïŒãçšããåå¥è§£æã®åºç€ãæ¢ããŸããã³ã³ãã€ã©ãã€ã³ã¿ããªã¿ã«ããããœãŒã¹ã³ãŒãã®ããŒã¯ã³åãžã®FSAã®å¿ç𿹿³ãåŠã³ãŸãã
åå¥è§£æïŒæéãªãŒãããã³ã®åŸ¹åºè§£èª¬
ã³ã³ãã¥ãŒã¿ç§åŠã®é åãç¹ã«ã³ã³ãã€ã©èšèšãã€ã³ã¿ããªã¿éçºã«ãããŠãåå¥è§£æã¯éèŠãªåœ¹å²ãæãããŸããããã¯ã³ã³ãã€ã©ã®æåã®ãã§ãŒãºã圢æãããœãŒã¹ã³ãŒããããŒã¯ã³ã®ã¹ããªãŒã ã«åè§£ãã圹å²ãæ ããŸãããã®ããã»ã¹ã«ã¯ãããŒã¯ãŒããæŒç®åãèå¥åããªãã©ã«ã®ç¹å®ãå«ãŸããŸããåå¥è§£æã«ãããåºæ¬çãªæŠå¿µã¯ããããã®ããŒã¯ã³ãèªèãåé¡ããããã«ãæéãªãŒãããã³ïŒFAïŒãšããŠãç¥ãããæéç¶æ ãªãŒãããã³ïŒFSAïŒã䜿çšããããšã§ãããã®èšäºã§ã¯ãFSAãçšããåå¥è§£æã«ã€ããŠããã®ååãå¿çšãå©ç¹ãå æ¬çã«æ¢æ±ããŸãã
åå¥è§£æãšã¯äœãïŒ
åå¥è§£æã¯ãã¹ãã£ãã³ã°ãããŒã¯ã³åãšããŠãç¥ãããæåã®ã·ãŒã±ã³ã¹ïŒãœãŒã¹ã³ãŒãïŒãããŒã¯ã³ã®ã·ãŒã±ã³ã¹ã«å€æããããã»ã¹ã§ããåããŒã¯ã³ã¯ããã°ã©ãã³ã°èšèªã«ãããæå³ã®ããåäœã衚ããŸããåå¥è§£æåšïŒãŸãã¯ã¹ãã£ãïŒã¯ãœãŒã¹ã³ãŒããæååäœã§èªã¿åããããããåå¥ïŒlexemeïŒã«ã°ã«ãŒãåãããã®åŸããŒã¯ã³ã«ãããã³ã°ããŸããããŒã¯ã³ã¯éåžžãããŒã¯ã³ã¿ã€ãïŒäŸïŒIDENTIFIER, INTEGER, KEYWORDïŒãšããŒã¯ã³å€ïŒäŸïŒ"variableName", "123", "while"ïŒã®ãã¢ãšããŠè¡šçŸãããŸãã
äŸãã°ã次ã®ãããªã³ãŒãè¡ãèããŠã¿ãŸãããïŒ
int count = 0;
åå¥è§£æåšã¯ããã以äžã®ããŒã¯ã³ã«åè§£ããŸãïŒ
- ããŒã¯ãŒã: int
- èå¥å: count
- æŒç®å: =
- æŽæ°: 0
- å¥èªç¹: ;
æéç¶æ ãªãŒãããã³ïŒFSAïŒ
æéç¶æ ãªãŒãããã³ïŒFSAïŒã¯ã以äžããæ§æãããèšç®ã®æ°åŠçã¢ãã«ã§ãïŒ
- æéã®ç¶æ éåïŒ FSAã¯ä»»æã®æç¹ã§æéåã®ç¶æ ã®ãã¡ã®1ã€ã«ããããšãã§ããŸãã
- æéã®å ¥åèšå·éåïŒã¢ã«ãã¡ãããïŒïŒ FSAãèªã¿åãããšãã§ããèšå·ã§ãã
- é·ç§»é¢æ°ïŒ ãã®é¢æ°ã¯ãFSAãèªã¿åã£ãå ¥åèšå·ã«åºã¥ããŠãããç¶æ ããå¥ã®ç¶æ ãžã©ã®ããã«ç§»åããããå®çŸ©ããŸãã
- éå§ç¶æ ïŒ FSAãéå§ããç¶æ ã§ãã
- åçïŒãŸãã¯æçµïŒç¶æ ã®éåïŒ å ¥åå šäœãåŠçããåŸã«FSAããããã®ç¶æ ã®1ã€ã§çµäºããå Žåããã®å ¥åã¯åçããããšèŠãªãããŸãã
FSAã¯ãã°ãã°ç¶æ å³ãçšããŠèŠèŠçã«è¡šçŸãããŸããç¶æ å³ã§ã¯ïŒ
- ç¶æ ã¯åã§è¡šãããŸãã
- é·ç§»ã¯å ¥åèšå·ã§ã©ãã«ä»ããããç¢å°ã§è¡šãããŸãã
- éå§ç¶æ ã¯å ¥ã£ãŠããç¢å°ã§ç€ºãããŸãã
- åçç¶æ ã¯äºéåã§ç€ºãããŸãã
決å®ç vs. éæ±ºå®çFSA
FSAã¯æ±ºå®çïŒDFAïŒãŸãã¯é決å®çïŒNFAïŒã®ããããã«ãªããŸããDFAã§ã¯ãåç¶æ ãšå ¥åèšå·ã«å¯ŸããŠãå¥ã®ç¶æ ãžã®é·ç§»ãã¡ããã©1ã€ã ãååšããŸããNFAã§ã¯ãç¹å®ã®å ¥åèšå·ã«å¯ŸããŠ1ã€ã®ç¶æ ããè€æ°ã®é·ç§»ãååšããããå ¥åèšå·ãªãã®é·ç§»ïŒÎµé·ç§»ïŒããã£ããããŸãã
NFAã¯ããæè»ã§ãèšèšã容æãªå ŽåããããŸãããå®è£ ã¯DFAã®æ¹ãå¹ççã§ããä»»æã®NFAã¯ç䟡ãªDFAã«å€æããããšãã§ããŸãã
åå¥è§£æãžã®FSAã®å©çš
FSAã¯æ£èŠèšèªãå¹ççã«èªèã§ãããããåå¥è§£æã«é©ããŠããŸããæ£èŠè¡šçŸã¯ããŒã¯ã³ã®ãã¿ãŒã³ãå®çŸ©ããããã«ãã䜿çšãããä»»æã®æ£èŠè¡šçŸã¯ç䟡ãªFSAã«å€æããããšãã§ããŸããåå¥è§£æåšã¯ãããã®FSAã䜿çšããŠå ¥åãã¹ãã£ã³ããããŒã¯ã³ãèå¥ããŸãã
äŸïŒèå¥åã®èªè
èå¥åãèªèããã¿ã¹ã¯ãèããŠã¿ãŸããããèå¥åã¯éåžžãæåã§å§ãŸãããã®åŸã«æåãŸãã¯æ°åãç¶ãããšãã§ããŸããããã«å¯Ÿããæ£èŠè¡šçŸã¯ `[a-zA-Z][a-zA-Z0-9]*` ãšãªããŸãããã®ãããªèå¥åãèªèããããã«FSAãæ§ç¯ããããšãã§ããŸãã
FSAã¯ä»¥äžã®ç¶æ ãæã¡ãŸãïŒ
- ç¶æ 0ïŒéå§ç¶æ ïŒïŒ åæç¶æ ã
- ç¶æ 1ïŒ åçç¶æ ãæåã®æåãèªã¿åã£ãåŸã«å°éããŸãã
é·ç§»ã¯ä»¥äžã®ããã«ãªããŸãïŒ
- ç¶æ 0ãããæåïŒa-zãŸãã¯A-ZïŒã®å ¥åã§ç¶æ 1ã«é·ç§»ããŸãã
- ç¶æ 1ãããæåïŒa-zãŸãã¯A-ZïŒãŸãã¯æ°åïŒ0-9ïŒã®å ¥åã§ç¶æ 1ã«é·ç§»ããŸãã
å ¥åãåŠçããåŸã«FSAãç¶æ 1ã«å°éããå Žåããã®å ¥åã¯èå¥åãšããŠèªèãããŸãã
äŸïŒæŽæ°ã®èªè
åæ§ã«ãæŽæ°ãèªèããããã®FSAãäœæã§ããŸããæŽæ°ã®æ£èŠè¡šçŸã¯ `[0-9]+`ïŒ1ã€ä»¥äžã®æ°åïŒã§ãã
FSAã¯ä»¥äžã®ããã«ãªããŸãïŒ
- ç¶æ 0ïŒéå§ç¶æ ïŒïŒ åæç¶æ ã
- ç¶æ 1ïŒ åçç¶æ ãæåã®æ°åãèªã¿åã£ãåŸã«å°éããŸãã
é·ç§»ã¯ä»¥äžã®ããã«ãªããŸãïŒ
- ç¶æ 0ãããæ°åïŒ0-9ïŒã®å ¥åã§ç¶æ 1ã«é·ç§»ããŸãã
- ç¶æ 1ãããæ°åïŒ0-9ïŒã®å ¥åã§ç¶æ 1ã«é·ç§»ããŸãã
FSAãçšããåå¥è§£æåšã®å®è£
åå¥è§£æåšã®å®è£ ã«ã¯ã以äžã®ã¹ããããå«ãŸããŸãïŒ
- ããŒã¯ã³ã¿ã€ãã®å®çŸ©ïŒ ããã°ã©ãã³ã°èšèªå ã®ãã¹ãŠã®ããŒã¯ã³ã¿ã€ãïŒäŸïŒKEYWORD, IDENTIFIER, INTEGER, OPERATOR, PUNCTUATIONïŒãç¹å®ããŸãã
- åããŒã¯ã³ã¿ã€ãã«å¯Ÿããæ£èŠè¡šçŸã®äœæïŒ åããŒã¯ã³ã¿ã€ãã®ãã¿ãŒã³ãæ£èŠè¡šçŸã䜿çšããŠå®çŸ©ããŸãã
- æ£èŠè¡šçŸã®FSAãžã®å€æïŒ 忣èŠè¡šçŸãç䟡ãªFSAã«å€æããŸããããã¯æåã§è¡ãããFlexïŒFast Lexical Analyzer GeneratorïŒãªã©ã®ããŒã«ã䜿çšããŠè¡ãããšãã§ããŸãã
- FSAã®åäžFSAãžã®çµåïŒ ãã¹ãŠã®FSAãããã¹ãŠã®ããŒã¯ã³ã¿ã€ããèªèã§ããåäžã®FSAã«çµåããŸããããã¯éåžžãFSAã®åéåæŒç®ã䜿çšããŠè¡ãããŸãã
- åå¥è§£æåšã®å®è£ ïŒ çµåãããFSAãã·ãã¥ã¬ãŒãããããšã§åå¥è§£æåšãå®è£ ããŸããåå¥è§£æåšã¯å ¥åãæååäœã§èªã¿åããå ¥åã«åºã¥ããŠç¶æ éãé·ç§»ããŸããFSAãåçç¶æ ã«éãããšãããŒã¯ã³ãèªèãããŸãã
åå¥è§£æã®ããã®ããŒã«
åå¥è§£æã®ããã»ã¹ãèªååããããã«ãããã€ãã®ããŒã«ãå©çšå¯èœã§ãããããã®ããŒã«ã¯éåžžãããŒã¯ã³ã¿ã€ããšãã®å¯Ÿå¿ããæ£èŠè¡šçŸã®ä»æ§ãå ¥åãšããŠåãåããåå¥è§£æåšã®ã³ãŒããçæããŸãã人æ°ã®ããããŒã«ã«ã¯ä»¥äžã®ãããªãã®ããããŸãïŒ
- FlexïŒ é«éãªåå¥è§£æåšãžã§ãã¬ãŒã¿ãæ£èŠè¡šçŸãå«ã仿§ãã¡ã€ã«ãåãåããåå¥è§£æåšã®Cã³ãŒããçæããŸãã
- LexïŒ Flexã®å身ãFlexãšåãæ©èœãå®è¡ããŸãããå¹çã¯å£ããŸãã
- ANTLRïŒ åå¥è§£æã«ã䜿çšã§ãã匷åãªããŒãµãžã§ãã¬ãŒã¿ãJavaãC++ãPythonãªã©ãè€æ°ã®ã¿ãŒã²ããèšèªããµããŒãããŠããŸãã
åå¥è§£æã«FSAã䜿çšããå©ç¹
åå¥è§£æã«FSAã䜿çšããããšã«ã¯ãããã€ãã®å©ç¹ããããŸãïŒ
- å¹çæ§ïŒ FSAã¯æ£èŠèšèªãå¹ççã«èªèã§ãããããåå¥è§£æã¯é«éãã€å¹ççã§ããFSAãã·ãã¥ã¬ãŒãããæéèšç®éã¯éåžžO(n)ã§ãnã¯å ¥åã®é·ãã§ãã
- åçŽãïŒ FSAã¯æ¯èŒççè§£ããããå®è£ ã容æã§ãããããåå¥è§£æã«é©ããéžæè¢ã§ãã
- èªååïŒ FlexãLexã®ãããªããŒã«ã¯ãæ£èŠè¡šçŸããFSAãçæããããã»ã¹ãèªååã§ãããããåå¥è§£æåšã®éçºãããã«ç°¡çŽ åããŸãã
- æç¢ºã«å®çŸ©ãããçè«ïŒ FSAã®èåŸã«ããçè«ã¯æç¢ºã«å®çŸ©ãããŠãããå³å¯ãªåæãšæé©åãå¯èœã§ãã
課é¡ãšèæ ®äºé
FSAã¯åå¥è§£æã«åŒ·åã§ãããããã€ãã®èª²é¡ãèæ ®äºé ããããŸãïŒ
- æ£èŠè¡šçŸã®è€éãïŒ è€éãªããŒã¯ã³ã¿ã€ãã«å¯Ÿããæ£èŠè¡šçŸã®èšèšã¯å°é£ãªå ŽåããããŸãã
- ææ§ãïŒ æ£èŠè¡šçŸã¯ææ§ã«ãªãããšãããã1ã€ã®å ¥åãè€æ°ã®ããŒã¯ã³ã¿ã€ãã«äžèŽããå¯èœæ§ããããŸããåå¥è§£æåšã¯ããæé·äžèŽãããæåã®äžèŽããªã©ã®ã«ãŒã«ãçšããŠãããã®ææ§ãã解決ããå¿ èŠããããŸãã
- ãšã©ãŒåŠçïŒ åå¥è§£æåšã¯ãäºæããªãæåã«ééããå Žåãªã©ããšã©ãŒãé©åã«åŠçããå¿ èŠããããŸãã
- ç¶æ ççºïŒ NFAãDFAã«å€æããéã«ãDFAã®ç¶æ æ°ãNFAã®ç¶æ æ°ãããææ°é¢æ°çã«å€§ãããªãç¶æ ççºãçºçããããšããããŸãã
å®äžçã§ã®å¿çšãšäŸ
FSAãçšããåå¥è§£æã¯ãããŸããŸãªå®äžçã®ã¢ããªã±ãŒã·ã§ã³ã§åºã䜿çšãããŠããŸããããã€ãã®äŸãèŠãŠã¿ãŸãããïŒ
ã³ã³ãã€ã©ãšã€ã³ã¿ããªã¿
åè¿°ã®éããåå¥è§£æã¯ã³ã³ãã€ã©ãšã€ã³ã¿ããªã¿ã®åºæ¬çãªéšåã§ããäºå®äžãã¹ãŠã®ããã°ã©ãã³ã°èšèªã®å®è£ ã¯ããœãŒã¹ã³ãŒããããŒã¯ã³ã«åè§£ããããã«åå¥è§£æåšã䜿çšããŠããŸãã
ããã¹ããšãã£ã¿ãšIDE
ããã¹ããšãã£ã¿ãçµ±åéçºç°å¢ïŒIDEïŒã¯ãã·ã³ã¿ãã¯ã¹ãã€ã©ã€ããã³ãŒãè£å®ã®ããã«åå¥è§£æã䜿çšããŸããããŒã¯ãŒããæŒç®åãèå¥åãç¹å®ããããšã§ããããã®ããŒã«ã¯ã³ãŒããç°ãªãè²ã§ãã€ã©ã€ãããèªã¿ãããçè§£ããããããŸããã³ãŒãè£å®æ©èœã¯ãã³ãŒãã®æèã«åºã¥ããŠæå¹ãªèå¥åãããŒã¯ãŒããææ¡ããããã«åå¥è§£æã«äŸåããŠããŸãã
æ€çŽ¢ãšã³ãžã³
æ€çŽ¢ãšã³ãžã³ã¯ãWebããŒãžãã€ã³ããã¯ã¹åããæ€çŽ¢ã¯ãšãªãåŠçããããã«åå¥è§£æã䜿çšããŸããããã¹ããããŒã¯ã³ã«åè§£ããããšã§ãæ€çŽ¢ãšã³ãžã³ã¯ãŠãŒã¶ãŒã®æ€çŽ¢ã«é¢é£ããããŒã¯ãŒãããã¬ãŒãºãç¹å®ã§ããŸããåå¥è§£æã¯ãŸãããã¹ãŠã®åèªãå°æåã«å€æããããå¥èªç¹ãé€å»ããããããªã©ãããã¹ãã®æ£èŠåã«ã䜿çšãããŸãã
ããŒã¿æ€èšŒ
åå¥è§£æã¯ããŒã¿æ€èšŒã«äœ¿çšã§ããŸããäŸãã°ãFSAã䜿çšããŠæååãé»åã¡ãŒã«ã¢ãã¬ã¹ãé»è©±çªå·ã®ãããªç¹å®ã®åœ¢åŒã«äžèŽãããã©ããã確èªã§ããŸãã
é«åºŠãªãããã¯
åºæ¬ãè¶ ããŠãåå¥è§£æã«é¢é£ããããã€ãã®é«åºŠãªãããã¯ããããŸãïŒ
å èªã¿ïŒã«ãã¯ã¢ãããïŒ
æã ãåå¥è§£æåšã¯æ£ããããŒã¯ã³ã¿ã€ããæ±ºå®ããããã«ãå ¥åã¹ããªãŒã ãå èªã¿ããå¿ èŠããããŸããäŸãã°ãäžéšã®èšèªã§ã¯ãæåã·ãŒã±ã³ã¹ `..` ã¯2ã€ã®å¥ã ã®ããªãªãããåäžã®ç¯å²æŒç®åã®ããããã«ãªããŸããåå¥è§£æåšã¯ãã©ã¡ãã®ããŒã¯ã³ãçæããããæ±ºå®ããããã«æ¬¡ã®æåãèŠãå¿ èŠããããŸããããã¯éåžžãèªã¿åãããããŸã æ¶è²»ãããŠããªãæåãæ ŒçŽããããã®ãããã¡ã䜿çšããŠå®è£ ãããŸãã
èšå·è¡šïŒã·ã³ãã«ããŒãã«ïŒ
åå¥è§£æåšã¯ãã°ãã°èšå·è¡šãšå¯Ÿè©±ããŸããèšå·è¡šã¯ãèå¥åã®åãå€ãã¹ã³ãŒããªã©ã®æ å ±ãæ ŒçŽããŸããåå¥è§£æåšãèå¥åã«ééãããšããã®èå¥åããã§ã«èšå·è¡šã«ãããã©ããããã§ãã¯ããŸããããããã°ãåå¥è§£æåšã¯èšå·è¡šããèå¥åã«é¢ããæ å ±ãååŸããŸãããªããã°ãåå¥è§£æåšã¯ãã®èå¥åãèšå·è¡šã«è¿œå ããŸãã
ãšã©ãŒå埩
åå¥è§£æåšããšã©ãŒã«ééããå Žåãé©åã«å埩ããå ¥åã®åŠçãç¶è¡ããå¿ èŠããããŸããäžè¬çãªãšã©ãŒå埩æè¡ã«ã¯ãè¡ã®æ®ããã¹ããããããæ¬ èœããŠããããŒã¯ã³ãæ¿å ¥ããããŸãã¯äœåãªããŒã¯ã³ãåé€ãããªã©ããããŸãã
åå¥è§£æã®ãã¹ããã©ã¯ãã£ã¹
åå¥è§£æãã§ãŒãºã®æå¹æ§ã確ä¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- 培åºããããŒã¯ã³å®çŸ©ïŒ ææ§ãã®ãªãæ£èŠè¡šçŸã§ãã¹ãŠã®å¯èœãªããŒã¯ã³ã¿ã€ããæç¢ºã«å®çŸ©ããŸããããã«ãããäžè²«ããããŒã¯ã³èªèãä¿èšŒãããŸãã
- æ£èŠè¡šçŸã®æé©åãåªå ïŒ ããã©ãŒãã³ã¹ã®ããã«æ£èŠè¡šçŸãæé©åããŸããã¹ãã£ã³ããã»ã¹ãé ãããå¯èœæ§ã®ããè€éãŸãã¯éå¹çãªãã¿ãŒã³ãé¿ããŸãã
- ãšã©ãŒåŠçã¡ã«ããºã ïŒ èªèãããªãæåãç¡å¹ãªããŒã¯ã³ã·ãŒã±ã³ã¹ãç¹å®ã管çããããã®å ç¢ãªãšã©ãŒåŠçãå®è£ ããŸããæçãªãšã©ãŒã¡ãã»ãŒãžãæäŸããŸãã
- ã³ã³ããã¹ããæèããã¹ãã£ã³ïŒ ããŒã¯ã³ãçŸããã³ã³ããã¹ããèæ ®ããŸããäžéšã®èšèªã«ã¯ã远å ã®ããžãã¯ãå¿ èŠãšããã³ã³ããã¹ãäŸåã®ããŒã¯ãŒããæŒç®åããããŸãã
- èšå·è¡šã®ç®¡çïŒ èå¥åã«é¢ããæ å ±ãæ ŒçŽãååŸããããã®å¹ççãªèšå·è¡šãç¶æããŸããé«éãªæ€çŽ¢ãšæ¿å ¥ã®ããã«é©åãªããŒã¿æ§é ã䜿çšããŸãã
- åå¥è§£æåšãžã§ãã¬ãŒã¿ã®æŽ»çšïŒ FlexãLexã®ãããªããŒã«ã䜿çšããŠãæ£èŠè¡šçŸã®ä»æ§ããåå¥è§£æåšã®çæãèªååããŸãã
- 宿çãªãã¹ããšæ€èšŒïŒ ããŸããŸãªå ¥åããã°ã©ã ã§åå¥è§£æåšã培åºçã«ãã¹ãããæ£ç¢ºæ§ãšå ç¢æ§ã確ä¿ããŸãã
- ã³ãŒãã®ææžåïŒ æ£èŠè¡šçŸãç¶æ é·ç§»ããšã©ãŒåŠçã¡ã«ããºã ãå«ããåå¥è§£æåšã®èšèšãšå®è£ ãææžåããŸãã
çµè«
æéç¶æ ãªãŒãããã³ãçšããåå¥è§£æã¯ãã³ã³ãã€ã©èšèšãšã€ã³ã¿ããªã¿éçºã«ãããåºæ¬çãªæè¡ã§ãããœãŒã¹ã³ãŒããããŒã¯ã³ã®ã¹ããªãŒã ã«å€æããããšã«ãããåå¥è§£æåšã¯ã³ãŒãã®æ§é åããã衚çŸãæäŸããããã¯ã³ã³ãã€ã©ã®ãã®åŸã®ãã§ãŒãºã§ããã«åŠçãããŸããFSAã¯æ£èŠèšèªãèªèããããã®å¹ççã§æç¢ºã«å®çŸ©ãããæ¹æ³ãæäŸããåå¥è§£æã®ããã®åŒ·åãªããŒã«ãšãªããŸããåå¥è§£æã®ååãšæè¡ãçè§£ããããšã¯ãã³ã³ãã€ã©ãã€ã³ã¿ããªã¿ããŸãã¯ä»ã®èšèªåŠçããŒã«ã«åãçµããã¹ãŠã®äººã«ãšã£ãŠäžå¯æ¬ ã§ããæ°ããããã°ã©ãã³ã°èšèªãéçºããŠããå Žåã§ããåã«ã³ã³ãã€ã©ãã©ã®ããã«æ©èœããããçè§£ããããšããŠããå Žåã§ããåå¥è§£æã®ç¢ºããªçè§£ã¯éåžžã«è²Žéã§ãã